test(core): add comprehensive RetryManager test suite#1159
Merged
Conversation
4 tasks
3371651 to
0c85b0f
Compare
ba89956 to
aac6169
Compare
0c85b0f to
8f21c88
Compare
aac6169 to
cf2abd2
Compare
2 tasks
8f21c88 to
225e64a
Compare
cf2abd2 to
23ae940
Compare
225e64a to
f51911b
Compare
23ae940 to
9f2575b
Compare
f51911b to
fcdc491
Compare
9f2575b to
6981059
Compare
fcdc491 to
a8c9435
Compare
6981059 to
c49e640
Compare
a8c9435 to
ad417e4
Compare
c49e640 to
02cca5f
Compare
ad417e4 to
06a5962
Compare
42d7cd1 to
6bf54b1
Compare
2539c34 to
fa31a9c
Compare
f52a425 to
e83d5ab
Compare
2d313d8 to
89ce849
Compare
e83d5ab to
91c9ce3
Compare
89ce849 to
548872e
Compare
91c9ce3 to
7242cbf
Compare
548872e to
4f8ea2f
Compare
dbe8e59 to
fd41e95
Compare
e00cdf7 to
b0855f7
Compare
fd41e95 to
4a96660
Compare
b0855f7 to
3ab9660
Compare
4a96660 to
31f8677
Compare
3ab9660 to
3bb783a
Compare
31f8677 to
72f014c
Compare
7b9920f to
b4fe8b9
Compare
- Validate persisted state in canRetry() to handle clock changes/corruption per SDD §Metadata Lifecycle - Move backoff calculation inside dispatch to avoid stale retryCount from concurrent batch failures (handleErrorWithBackoff) - Ensure RATE_LIMITED state is never downgraded to BACKING_OFF - Update reset() docstring to clarify when it should be called Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Simplify class docstring to describe current architecture without referencing SDD deviations. Remove redundant inline comments, compact JSDoc to single-line where appropriate, and ensure all comments use present tense. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…gnaling
- Use getState(true) for queue-safe reads to prevent race conditions
between concurrent canRetry/handle429/handleTransientError calls
- Consolidate handleError and handleErrorWithBackoff into a single
method that accepts a computeWaitUntilTime function
- Extract side effects (logging, Math.random) from dispatch reducers
- Return RetryResult ('rate_limited'|'backed_off'|'limit_exceeded')
from handle429/handleTransientError so callers can drop events on
limit exceeded
- Clear auto-flush timer in transitionToReady
- Validate state string in isPersistedStateValid
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace string literals with TypeScript enums: - RetryState enum (READY, RATE_LIMITED, BACKING_OFF) - RetryResult enum (RATE_LIMITED, BACKED_OFF, LIMIT_EXCEEDED) Extract helper methods for clarity: - resolveStatePrecedence(): handles 429 taking priority over backoff - consolidateWaitTime(): uses switch statement for clear wait time logic - getStateDisplayName(): maps state to display names Benefits: - Type-safe state handling (no magic strings) - Switch statements make control flow explicit - Each helper method has a single, named responsibility - Easier to test and maintain Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Use Object.values(RetryState).includes() instead of maintaining a duplicate Set of valid states. More idiomatic TypeScript and eliminates maintenance burden of keeping Set in sync with enum.
Add 29 tests covering all RetryManager states and transitions: canRetry, handle429 rate limiting, handleTransientError backoff, reset, retry strategies (eager/lazy), autoFlush callbacks, and mixed error scenarios. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Updated test to verify that 429 now correctly overrides BACKING_OFF state rather than being silently ignored. The 429's retry-after takes precedence. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add test verifying 429 Retry-After overrides long transient backoff - Track RetryManager instances in autoFlush tests and destroy in afterEach to prevent timer leaks Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Update log assertions for consolidated limit-exceeded message. Add tests for: RetryResult return values, jitter calculation, isPersistedStateValid clock skew detection, handle429(0) edge case, and strengthened assertions that verify behavioral state after clamping/rejection (not just log output). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
didiergarcia
approved these changes
Mar 24, 2026
b4fe8b9 to
f274d86
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
canRetry: READY/RATE_LIMITED/BACKING_OFF states, wait expiry transitions, disabled configshandle429: retry count, lazy consolidation, clamping, negative/zero retry-after, max count/duration limits withlimit_exceededreturn verification, 429-overrides-BACKING_OFF, Retry-After authorityhandleTransientError: retry count, exponential backoff, max backoff clamping, max count/duration limits withlimit_exceededreturn verificationreset: count and state resetretryStrategy: lazy (default), eager, applies to transient errorsautoFlush: timer fires, no-callback safety, clear on reset/destroy, timer replacementreturn values:undefinedwhen configs disabledjitter: additive jitter formula with non-zerojitterPercent, zero jitter adds no randomnessisPersistedStateValid: clock skew detection (firstFailureTime in future)mixed errors: 429 wait time takes precedence over shorter transient backoffPR 4 of 5 in the TAPI backoff/retry stack. Depends on #1158.
Test plan
🤖 Generated with Claude Code